home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / prgtools / gnustuff / minix / libsrc~1.z / libsrc~1 / getpwent.c < prev    next >
Encoding:
C/C++ Source or Header  |  1989-12-28  |  1.7 KB  |  128 lines

  1. #include "lib.h"
  2.  
  3. /*
  4.  * get entry from password file
  5.  *
  6.  * By Patrick van Kleef
  7.  *
  8.  */
  9.  
  10.  
  11. #include <pwd.h>
  12.  
  13. #define PRIVATE static
  14.  
  15.  
  16. PRIVATE char  _pw_file[] = "/etc/passwd";
  17. PRIVATE char  _pwbuf[256];
  18. PRIVATE char  _buffer[1024];
  19. PRIVATE char *_pnt;
  20. PRIVATE char *_buf;
  21. PRIVATE int   _pw = -1;
  22. PRIVATE int   _bufcnt;
  23. PRIVATE struct passwd    pwd;
  24.  
  25. int setpwent() 
  26. {
  27.     if (_pw >= 0)
  28.         lseek (_pw, 0L, 0);
  29.     else
  30.         _pw = open (_pw_file, 0);
  31.  
  32.     _bufcnt = 0;
  33.     return (_pw);
  34. }
  35.  
  36.  
  37. void endpwent () 
  38. {
  39.     if (_pw >= 0)
  40.         close (_pw);
  41.  
  42.     _pw = -1;
  43.     _bufcnt = 0;
  44. }
  45.  
  46. static int getline () 
  47. {
  48.     if (_pw < 0 && setpwent () < 0)
  49.         return (0);
  50.     _buf = _pwbuf;
  51.     do {
  52.         if (--_bufcnt <= 0){
  53.             if ((_bufcnt = read (_pw, _buffer, 1024)) <= 0)
  54.                 return (0);
  55.             else
  56.                 _pnt = _buffer;
  57.         }
  58.         *_buf++ = *_pnt++;
  59.     } while (*_pnt != '\n');
  60.     _pnt++;
  61.     _bufcnt--;
  62.     *_buf = 0;
  63.     _buf = _pwbuf;
  64.     return (1);
  65. }
  66.  
  67. static void skip_period () 
  68. {
  69.     while (*_buf != ':')
  70.         _buf++;
  71.  
  72.     *_buf++ = '\0';
  73. }
  74.  
  75. struct passwd  *getpwent () 
  76. {
  77.     if (getline () == 0)
  78.         return (0);
  79.  
  80.     pwd.pw_name = _buf;
  81.     skip_period ();
  82.     pwd.pw_passwd = _buf;
  83.     skip_period ();
  84.     pwd.pw_uid = atoi (_buf);
  85.     skip_period ();
  86.     pwd.pw_gid = atoi (_buf);
  87.     skip_period ();
  88.     pwd.pw_gecos = _buf;
  89.     skip_period ();
  90.     pwd.pw_dir = _buf;
  91.     skip_period ();
  92.     pwd.pw_shell = _buf;
  93.  
  94.     return (&pwd);
  95. }
  96.  
  97. struct passwd  *getpwnam (name)
  98. _CONST char   *name;
  99. {
  100.     struct passwd  *pwd;
  101.  
  102.     setpwent ();
  103.     while ((pwd = getpwent ()) != 0)
  104.         if (!strcmp (pwd -> pw_name, name))
  105.             break;
  106.     endpwent ();
  107.     if (pwd != 0)
  108.         return (pwd);
  109.     else
  110.         return (0);
  111. }
  112.  
  113. struct passwd  *getpwuid (uidd)
  114. int     uidd;
  115. {
  116.     struct passwd  *pwd;
  117.  
  118.     setpwent ();
  119.     while ((pwd = getpwent ()) != 0)
  120.         if (pwd -> pw_uid == uidd)
  121.             break;
  122.     endpwent ();
  123.     if (pwd != 0)
  124.         return (pwd);
  125.     else
  126.         return (0);
  127. }
  128.